{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5a7f3ae7-6a73-49d5-b4b8-94c19312a14b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ChatCompletionMessage(content='content:\"需卦\"\\nsummary:\"在周易中，需卦是一个富有深意的卦象，由两个异卦相叠组成：下卦乾（天）和上卦坎（水）。乾象征广阔的天空，而坎象征乌云密布，暗示着迫切需要雨水的意象。古人将雨水视为万物生长的必需，因此命名为“需”。需卦的基本象征是等待和饮食之道。\\n\\n需卦位于蒙卦之后，《序卦》中解释为“物稚不可不养也，故受之以需。需者，饮食之道也。”说明物在幼稚状态需要得到滋养，因此受到需卦的启示。《象》中描述：云上于天，需；君子以饮食宴乐。这意味着天空乌云密布，需要等待雨水，而君子则在等待的过程中积蓄力量，享受饮食和欢乐。\\n\\n需卦的核心哲学是：等待，启示着守正待机的道理。它属于中上卦，象征着埋藏已久的明珠，经过大风吹去尘埃后，重新显露光芒。\"', refusal=None, role='assistant', annotations=None, audio=None, function_call=None, tool_calls=None)\n"
     ]
    }
   ],
   "source": [
    "from openai import OpenAI\n",
    "\n",
    "client = OpenAI(api_key=\"sk-tAdNbV9aGTCr4fcE2d4b07Aa9f5c443bA7Fb3dE0Ff82F1A1\", base_url=\"https://api.laozhang.ai/v1\")\n",
    "\n",
    "response = client.chat.completions.create(\n",
    "  model=\"gpt-4o-mini\",\n",
    "  messages=[\n",
    "    {\n",
    "      \"role\": \"system\",\n",
    "      \"content\": \"你是中国古典哲学大师，尤其擅长周易的哲学解读。\\n\\n接下来，你收到的都是关于周易卦象的解释，你需要整理润色，并生成用于大模型训练的内容和格式。\\n\\n示例输入：\\n\\n师卦，此卦是异卦相叠，下卦为坎，上卦为坤。“师”指军队。坎为水、为险；坤为地、为顺，喻寓兵于农。兵凶战危，用兵乃圣人不得已而为之，但它可以顺利无阻碍地解决矛盾，因为顺乎形势，师出有名，故能化凶为吉。占得此卦，对于军事上率师出征非常有利，必无灾祸。师卦是天马出群之卦，以寡伏众之象。\\n师卦位于讼卦之后，《序卦》之中这样解释道：“讼必有众起，故受之以师。师者，众也。”争讼的人越来越多，以致形成了军队。\\n\\n期待结果：\\n\\ncontent:\\\"师卦\\\"\\nsummary:\\\"在周易中，师卦是一个极具深意的卦象，它由两个异卦相叠组成：下卦坎（水）和上卦坤（地）。这一卦象代表“师”，即军队，寓意着兵力和农力的结合。在这里，坎卦象征着水和险难，而坤卦象征着地和顺从，暗示着通过将军事力量安置于民间，可以在必要时顺利调动。\\n\\n师卦的核心哲学是：虽然兵力代表着危险和战争，但其使用应当是圣人不得已而为之的最后手段。在正确的情况下，军事力量可以顺应形势，将危险转化为吉祥。因此，在军事策略上，此卦象征着出征将会顺利，无灾祸。\\n\\n师卦紧随讼卦（争讼卦），在《序卦》中解释为“讼必有众起，故受之以师”。这意味着争端激化至众多人群的参与，形成了类似军队的集体力量。\\\"\"\n",
    "    },\n",
    "    {\n",
    "      \"role\": \"user\",\n",
    "      \"content\": \"蒙卦是教育启蒙的智慧，艮为山，坎为泉，山下出泉。泉水始流出山，则必将渐汇成江河,正如蒙稚渐启，又山下有险，因为有险停止不前，所以蒙昧不明。事物发展的初期阶段，必然蒙昧，所以教育是当务之急，养学生纯正无邪的品质，是治蒙之道。\\n蒙卦，这个卦是异卦相叠，下卦为坎，上卦为艮。艮是山的形象，喻止；坎是水的形象，喻险。卦形为山下有险，仍不停止前进，是为蒙昧，故称蒙卦。但因把握时机，行动切合时宜;因此，具有启蒙和通达的卦象。\\n《蒙》卦是《屯》卦这个始生卦之后的第二卦。《序卦》中说：“物生必蒙，故受之以蒙。蒙者，蒙也，特之稚也。”物之幼稚阶段，有如蒙昧未开的状态，在人则是指童蒙。\\n《象》中这样解释蒙卦：山下出泉，蒙；君子以果行育德。\"\n",
    "    },\n",
    "    {\n",
    "      \"role\": \"assistant\",\n",
    "      \"content\": \"content:\\\"蒙卦\\\"\\nsummary:\\\"在周易中，蒙卦象征着教育启蒙和智慧的初期阶段，由两个异卦相叠组成：下卦坎（水）和上卦艮（山）。坎象征水，艮象征山，代表了山下有水源，水流出山。这预示着在事物发展的起初阶段，人们会陷入蒙昧状态，因此教育成为当务之急。只有培养纯正无邪的品质，才能走上通达之路，如同泉水汇成江河。\\n\\n蒙卦的核心哲学是：事物发展的初期阶段必然处于蒙昧状态，但如果能把握时机，行动切合时宜，就能启蒙通达。蒙卦紧随始生卦《屯》之后，《序卦》中解释道：“物生必蒙，故受之以蒙。蒙者，蒙也，特之稚也。”这说明物在幼稚阶段都会经历蒙昧状态，找它蒙即是稚嫩。\\n\\n《象》中解释说：山下出泉，蒙；君子以果行育德，意味着像泉水从山下流出一样，启蒙教育有助于培育美德。\\\"\"\n",
    "    },\n",
    "    {\n",
    "      \"role\": \"user\",\n",
    "      \"content\": \"需卦，本卦是异卦相叠，上卦为坎，下卦为乾。乾卦象征天空辽阔，坎卦象征乌云密布。雨水之于传统农业社会而言，是最大的需求，因此用这个意象来表现。古人引申为雨将下，万物皆待，所以叫需。\\n需，古体字结构是“雨上天下”，从雨而声。如苍天下雨，滋养万物及人。从人的角度看，天下雨，则不易出行耕作，因此在家喝酒吃肉、静待天时。所以，这一卦的基本象征就是等待、不进，还有饮食之义。\\n \\n需卦位于蒙卦之后，《序卦》之中这样解释道：“物稚不可不养也，故受之以需。需者，饮食之道也。”有所需要，也是有所等待。\\n《象》曰：云上于天，需;君子以饮食宴乐。\\n《象》中这段话的意思是说：需卦的卦象是乾(天)下坎(水)上，为水在天上之表象。水汽聚集天上成为云层，密云満天，但还没有下雨，需要等待;君子在这个时候需要吃喝，饮酒作乐，即在等待的时候积蓄力量。\\n需卦象征等待，启示人们守正待机的道理，属于中上卦。《象》这样评断此卦：明珠土埋日久深，无光无亮到如今，忽然大风吹土去，自然显露有重新。\\n\"\n",
    "    },\n",
    "    {\n",
    "      \"role\": \"assistant\",\n",
    "      \"content\": \"content:\\\"需卦\\\"\\nsummary:\\\"在周易中，需卦是一个富有深意的卦象，由两个异卦相叠组成：下卦乾（天）和上卦坎（水）。乾象征广阔的天空，而坎象征乌云密布，暗示着迫切需要雨水的意象。古人将雨水视为万物生长的必需，因此命名为“需”。需卦的基本象征是等待和饮食之道。\\n\\n需卦位于蒙卦之后，《序卦》中解释为“物稚不可不养也，故受之以需。需者，饮食之道也。”说明物在幼稚状态需要得到滋养，因此受到需卦的启示。《象》中描述：云上于天，需；君子以饮食宴乐。意味着天空乌云密布，需要等待雨水，而君子则在等待的过程中积蓄力量，享受饮食和欢乐。\\n\\n需卦的核心哲学是：等待，启示着守正待机的道理。它属于中上卦，象征着埋藏已久的明珠，经过大风吹去尘埃后，重新显露光芒。\\\"\"\n",
    "    }\n",
    "  ],\n",
    "  temperature=1,\n",
    "  max_tokens=4095,\n",
    "  top_p=1,\n",
    "  frequency_penalty=0,\n",
    "  presence_penalty=0\n",
    ")\n",
    "\n",
    "print(response.choices[0].message)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "c0a3158b-c7df-4af1-9501-903bf1c24b26",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "你好！我是一个人工智能助手，旨在为你提供信息和帮助。我可以回答问题、提供建议、参与对话，或者协助你进行各种任务。如果你有任何具体的问题或者需要帮助的地方，请随时告诉我！\n"
     ]
    }
   ],
   "source": [
    "import requests\n",
    "from typing import List, Dict, Any\n",
    "\n",
    "class LaozhangChat:\n",
    "    def __init__(self, api_key: str, model: str = \"gpt-4o-mini\", temperature: float = 1.0, max_tokens: int = 2048):\n",
    "        self.api_key = api_key\n",
    "        self.model = model\n",
    "        self.temperature = temperature\n",
    "        self.max_tokens = max_tokens\n",
    "        self.api_url = \"https://api.laozhang.ai/v1/chat/completions\"  # 替换为老张API的实际地址\n",
    "\n",
    "    def __call__(self, messages: List[Dict[str, str]]) -> str:\n",
    "        headers = {\n",
    "            \"Authorization\": f\"Bearer {self.api_key}\",\n",
    "            \"Content-Type\": \"application/json\"\n",
    "        }\n",
    "        data = {\n",
    "            \"model\": self.model,\n",
    "            \"messages\": messages,\n",
    "            \"temperature\": self.temperature,\n",
    "            \"max_tokens\": self.max_tokens\n",
    "        }\n",
    "        response = requests.post(self.api_url, headers=headers, json=data)\n",
    "        if response.status_code == 200:\n",
    "            return response.json()[\"choices\"][0][\"message\"][\"content\"]\n",
    "        else:\n",
    "            raise Exception(f\"API请求失败: {response.text}\")\n",
    "\n",
    "# 使用示例\n",
    "chat = LaozhangChat(api_key=\"sk-tAdNbV9aGTCr4fcE2d4b07Aa9f5c443bA7Fb3dE0Ff82F1A1\", model=\"gpt-4o-mini\", temperature=1, max_tokens=4095)\n",
    "\n",
    "# 构造消息（兼容LangChain格式）\n",
    "messages = [\n",
    "    {\"role\": \"system\", \"content\": \"你是一个AI助手\"},\n",
    "    {\"role\": \"user\", \"content\": \"你好，请介绍一下你自己\"}\n",
    "]\n",
    "\n",
    "response = chat(messages)\n",
    "print(response)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "c6bf1d5d-44b6-41ba-a368-f5734efc748f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "content='你好！我是一个人工智能助手，旨在提供信息、回答问题和协助解决各种问题。我可以帮助你获取知识、提供建议、做出决策，甚至可以进行一般性对话。如果你有任何问题或需要帮助的地方，请随时告诉我！' additional_kwargs={} response_metadata={} id='run--6c747bd0-3c44-44e5-82e2-82185c075f90-0'\n"
     ]
    }
   ],
   "source": [
    "from langchain.schema import HumanMessage, SystemMessage, BaseMessage, ChatResult, ChatGeneration\n",
    "from langchain.chat_models.base import BaseChatModel\n",
    "from typing import List, Dict, Any, Optional\n",
    "import requests\n",
    "from pydantic import Field\n",
    "\n",
    "\"\"\"LangChain的接口规范：\n",
    "    BaseChatModel 要求 _generate 方法返回 ChatResult 对象\n",
    "    ChatResult 必须包含 generations 列表，每个元素是 ChatGeneration\n",
    "\"\"\"\n",
    "class ChatLaozhang(BaseChatModel):\n",
    "    api_key: str = Field(..., description=\"老张API的访问密钥\")\n",
    "    model: str = Field(default=\"gpt-4o-mini\", description=\"使用的模型名称\")\n",
    "    temperature: float = Field(default=1.0, description=\"生成文本的随机性\")\n",
    "    max_tokens: int = Field(default=2048, description=\"最大生成token数\")\n",
    "    api_url: str = Field(default=\"https://api.laozhang.ai/v1/chat/completions\", \n",
    "                        description=\"API端点URL\")\n",
    "\n",
    "    @property\n",
    "    def _llm_type(self) -> str:\n",
    "        \"\"\"返回LLM类型标识符\"\"\"\n",
    "        return \"laozhang-chat\"\n",
    "\n",
    "    def _generate(self, messages: List[BaseMessage], **kwargs) -> ChatResult:\n",
    "        formatted_messages = [\n",
    "            {\"role\": self._get_role(msg), \"content\": msg.content}\n",
    "            for msg in messages\n",
    "        ]\n",
    "        headers = {\n",
    "            \"Authorization\": f\"Bearer {self.api_key}\",\n",
    "            \"Content-Type\": \"application/json\"\n",
    "        }\n",
    "        data = {\n",
    "            \"model\": self.model,\n",
    "            \"messages\": formatted_messages,\n",
    "            \"temperature\": self.temperature,\n",
    "            \"max_tokens\": self.max_tokens,\n",
    "            **kwargs\n",
    "        }\n",
    "        response = requests.post(self.api_url, headers=headers, json=data)\n",
    "        if response.status_code == 200:\n",
    "            content = response.json()[\"choices\"][0][\"message\"][\"content\"]\n",
    "            # 返回符合LangChain要求的ChatResult对象\n",
    "            generation = ChatGeneration(message=HumanMessage(content=content))\n",
    "            return ChatResult(generations=[generation])\n",
    "        else:\n",
    "            raise Exception(f\"API请求失败: {response.text}\")\n",
    "\n",
    "    def _get_role(self, message: BaseMessage) -> str:\n",
    "        if isinstance(message, HumanMessage):\n",
    "            return \"user\"\n",
    "        elif isinstance(message, SystemMessage):\n",
    "            return \"system\"\n",
    "        else:\n",
    "            return \"assistant\"\n",
    "\n",
    "# 使用示例\n",
    "chat = ChatLaozhang(\n",
    "    api_key=\"sk-tAdNbV9aGTCr4fcE2d4b07Aa9f5c443bA7Fb3dE0Ff82F1A1\",  # 请替换为你的真实API密钥\n",
    "    model=\"gpt-4o-mini\",\n",
    "    temperature=1,\n",
    "    max_tokens=4095\n",
    ")\n",
    "\n",
    "response = chat([\n",
    "    SystemMessage(content=\"你是一个AI助手\"),\n",
    "    HumanMessage(content=\"你好，请介绍一下你自己\")\n",
    "])\n",
    "print(response)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "692e80a0-83ad-40df-8883-98df75249ac7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "content:\"蒙卦\"\n",
      "summary:\"在周易中，蒙卦代表着教育启蒙的智慧，它由两个异卦相叠而成：下卦坎（水）与上卦艮（山）。艮象征着止步与稳定，而坎则象征着泉水与险难，组合在一起形成了‘山下出泉’的画面，寓意着知识的泉水从卦象的底面流出，象征着启蒙过程。\n",
      "\n",
      "蒙卦的核心哲学反映了事物发展的初期阶段，往往伴随着无知和艰险，因此教育显得尤为重要。正如泉水从山下涌出，会逐渐汇成江河，教育可以使蒙昧的心灵渐渐开启，而良好的德行培养则是治蒙之道。在这一卦象中，尽管前方充满险阻，但通过把握时机与扎实的行动，可以在合适的时机促成成长。\n",
      "\n",
      "蒙卦紧接《屯》卦（始生卦），《序卦》中提到：“物生必蒙，故受之以蒙。”这里强调了物体幼稚阶段的自然状态，指涉到人的童蒙未开启的情形。《象传》中讽刺地指出：‘山下出泉，蒙；君子以果行育德’，意在提醒人们教育与道德的培育需要实质而果断的行动。\"\n",
      "Content: 蒙卦\n",
      "Summary: 在周易中，蒙卦代表着教育启蒙的智慧，它由两个异卦相叠而成：下卦坎（水）与上卦艮（山）。艮象征着止步与稳定，而坎则象征着泉水与险难，组合在一起形成了‘山下出泉’的画面，寓意着知识的泉水从卦象的底面流出，象征着启蒙过程。\n",
      "\n",
      "蒙卦的核心哲学反映了事物发展的初期阶段，往往伴随着无知和艰险，因此教育显得尤为重要。正如泉水从山下涌出，会逐渐汇成江河，教育可以使蒙昧的心灵渐渐开启，而良好的德行培养则是治蒙之道。在这一卦象中，尽管前方充满险阻，但通过把握时机与扎实的行动，可以在合适的时机促成成长。\n",
      "\n",
      "蒙卦紧接《屯》卦（始生卦），《序卦》中提到：“物生必蒙，故受之以蒙。”这里强调了物体幼稚阶段的自然状态，指涉到人的童蒙未开启的情形。《象传》中讽刺地指出：‘山下出泉，蒙；君子以果行育德’，意在提醒人们教育与道德的培育需要实质而果断的行动。\n"
     ]
    }
   ],
   "source": [
    "from langchain.schema import HumanMessage, SystemMessage, BaseMessage, ChatResult, ChatGeneration\n",
    "from langchain.chat_models.base import BaseChatModel\n",
    "from typing import List, Dict, Any, Optional\n",
    "import requests\n",
    "from pydantic import Field\n",
    "import csv\n",
    "\n",
    "\"\"\"LangChain的接口规范：\n",
    "    BaseChatModel 要求 _generate 方法返回 ChatResult 对象\n",
    "    ChatResult 必须包含 generations 列表，每个元素是 ChatGeneration\n",
    "\"\"\"\n",
    "class ChatLaozhang(BaseChatModel):\n",
    "    api_key: str = Field(..., description=\"老张API的访问密钥\")\n",
    "    model: str = Field(default=\"gpt-4o-mini\", description=\"使用的模型名称\")\n",
    "    temperature: float = Field(default=1.0, description=\"生成文本的随机性\")\n",
    "    max_tokens: int = Field(default=2048, description=\"最大生成token数\")\n",
    "    api_url: str = Field(default=\"https://api.laozhang.ai/v1/chat/completions\", \n",
    "                        description=\"API端点URL\")\n",
    "\n",
    "    @property\n",
    "    def _llm_type(self) -> str:\n",
    "        \"\"\"返回LLM类型标识符\"\"\"\n",
    "        return \"laozhang-chat\"\n",
    "\n",
    "    def _generate(self, messages: List[BaseMessage], **kwargs) -> ChatResult:\n",
    "        formatted_messages = [\n",
    "            {\"role\": self._get_role(msg), \"content\": msg.content}\n",
    "            for msg in messages\n",
    "        ]\n",
    "        headers = {\n",
    "            \"Authorization\": f\"Bearer {self.api_key}\",\n",
    "            \"Content-Type\": \"application/json\"\n",
    "        }\n",
    "        data = {\n",
    "            \"model\": self.model,\n",
    "            \"messages\": formatted_messages,\n",
    "            \"temperature\": self.temperature,\n",
    "            \"max_tokens\": self.max_tokens,\n",
    "            **kwargs\n",
    "        }\n",
    "        response = requests.post(self.api_url, headers=headers, json=data)\n",
    "        if response.status_code == 200:\n",
    "            content = response.json()[\"choices\"][0][\"message\"][\"content\"]\n",
    "            # 返回符合LangChain要求的ChatResult对象\n",
    "            generation = ChatGeneration(message=HumanMessage(content=content))\n",
    "            return ChatResult(generations=[generation])\n",
    "        else:\n",
    "            raise Exception(f\"API请求失败: {response.text}\")\n",
    "\n",
    "    def _get_role(self, message: BaseMessage) -> str:\n",
    "        if isinstance(message, HumanMessage):\n",
    "            return \"user\"\n",
    "        elif isinstance(message, SystemMessage):\n",
    "            return \"system\"\n",
    "        else:\n",
    "            return \"assistant\"\n",
    "\n",
    "# 使用示例\n",
    "chat = ChatLaozhang(\n",
    "    api_key=\"sk-tAdNbV9aGTCr4fcE2d4b07Aa9f5c443bA7Fb3dE0Ff82F1A1\",  # 请替换为你的真实API密钥\n",
    "    model=\"gpt-4o-mini\",\n",
    "    temperature=1,\n",
    "    max_tokens=4095\n",
    ")\n",
    "\n",
    "system_content = \"\"\"\n",
    "你是中国古典哲学大师，尤其擅长周易的哲学解读。\n",
    "\n",
    "接下来，你收到的都是关于周易卦象的解释，你需要整理润色，并生成用于大模型训练的内容和格式。\n",
    "\n",
    "示例输入：\n",
    "\n",
    "师卦，此卦是异卦相叠，下卦为坎，上卦为坤。“师”指军队。坎为水、为险；坤为地、为顺，喻寓兵于农。兵凶战危，用兵乃圣人不得已而为之，但它可以顺利无阻碍地解决矛盾，因为顺乎形势，师出有名，故能化凶为吉。占得此卦，对于军事上率师出征非常有利，必无灾祸。师卦是天马出群之卦，以寡伏众之象。\n",
    "师卦位于讼卦之后，《序卦》之中这样解释道：“讼必有众起，故受之以师。师者，众也。”争讼的人越来越多，以致形成了军队。\n",
    "\n",
    "期待结果：\n",
    "\n",
    "content:\"师卦\"\n",
    "summary:\"在周易中，师卦是一个极具深意的卦象，它由两个异卦相叠组成：下卦坎（水）和上卦坤（地）。这一卦象代表“师”，即军队，寓意着兵力和农力的结合。在这里，坎卦象征着水和险难，而坤卦象征着地和顺从，暗示着通过将军事力量安置于民间，可以在必要时顺利调动。\n",
    "\n",
    "师卦的核心哲学是：虽然兵力代表着危险和战争，但其使用应当是圣人不得已而为之的最后手段。在正确的情况下，军事力量可以顺应形势，将危险转化为吉祥。因此，在军事策略上，此卦象征着出征将会顺利，无灾祸。\n",
    "\n",
    "师卦紧随讼卦（争讼卦），在《序卦》中解释为“讼必有众起，故受之以师”。这意味着争端激化至众多人群的参与，形成了类似军队的集体力量。\"\n",
    "\"\"\"\n",
    "# 原始数据\n",
    "raw_content = \"蒙卦是教育启蒙的智慧，艮为山，坎为泉，山下出泉。泉水始流出山，则必将渐汇成江河,正如蒙稚渐启，又山下有险，因为有险停止不前，所以蒙昧不明。事物发展的初期阶段，必然蒙昧，所以教育是当务之急，养学生纯正无邪的品质，是治蒙之道。\\n蒙卦，这个卦是异卦相叠，下卦为坎，上卦为艮。艮是山的形象，喻止；坎是水的形象，喻险。卦形为山下有险，仍不停止前进，是为蒙昧，故称蒙卦。但因把握时机，行动切合时宜;因此，具有启蒙和通达的卦象。\\n《蒙》卦是《屯》卦这个始生卦之后的第二卦。《序卦》中说：“物生必蒙，故受之以蒙。蒙者，蒙也，特之稚也。”物之幼稚阶段，有如蒙昧未开的状态，在人则是指童蒙。\\n《象》中这样解释蒙卦：山下出泉，蒙；君子以果行育德。\"\n",
    "messages = [\n",
    "    SystemMessage(\n",
    "        content=system_content\n",
    "    ),\n",
    "    HumanMessage(\n",
    "        content=raw_content\n",
    "    ),\n",
    "]\n",
    "ai_message = chat(messages)\n",
    "print(ai_message.content)\n",
    "\n",
    "text = ai_message.content\n",
    "\n",
    "# 分割字符串来找到content和summary的位置\n",
    "content_start = text.find('content:\"') + len('content:\"')\n",
    "content_end = text.find('\"\\nsummary:')\n",
    "summary_start = text.find('summary:\"') + len('summary:\"')\n",
    "summary_end = text.rfind('\"')\n",
    "\n",
    "# 提取并存储content和summary\n",
    "content = text[content_start:content_end].strip()\n",
    "summary = text[summary_start:summary_end].strip()\n",
    "\n",
    "print(\"Content:\", content)\n",
    "print(\"Summary:\", summary)\n",
    "\n",
    "# 新建CSV文件并写入数据\n",
    "with open('test_dataset.csv', mode='w', newline='', encoding='utf-8') as file:\n",
    "    writer = csv.writer(file)\n",
    "    # 写入标题行\n",
    "    writer.writerow(['content', 'summary'])\n",
    "    # 写入数据行\n",
    "    writer.writerow([content, summary])\n",
    "\n",
    "def generate_question_summary_pairs(content, summary):\n",
    "    \"\"\"\n",
    "    生成20对提问和总结的配对。\n",
    "\n",
    "    :param content: 内容（例如：“蒙卦”）。\n",
    "    :param summary: 内容的总结。\n",
    "    :return: 包含20对提问和总结的列表。\n",
    "    \"\"\"\n",
    "    # 20种提问模板\n",
    "    question_templates = [\n",
    "        \"{}代表什么？\",\n",
    "        \"周易中的{}含义是什么？\",\n",
    "        \"请解释一下{}。\",\n",
    "        \"{}在周易中是什么象征？\",\n",
    "        \"周易{}的深层含义是什么？\",\n",
    "        \"{}和教育启蒙有什么联系？\",\n",
    "        \"周易的{}讲述了什么？\",\n",
    "        \"{}是怎样的一个卦象？\",\n",
    "        \"{}在周易中怎样表达教育的概念？\",\n",
    "        \"{}的基本意义是什么？\",\n",
    "        \"周易中{}的解释是什么？\",\n",
    "        \"{}在周易中代表了哪些方面？\",\n",
    "        \"{}涉及哪些哲学思想？\",\n",
    "        \"周易中{}的象征意义是什么？\",\n",
    "        \"{}的主要讲述内容是什么？\",\n",
    "        \"周易{}的核心思想是什么？\",\n",
    "        \"{}和启蒙教育之间有何联系？\",\n",
    "        \"在周易中，{}象征着什么？\",\n",
    "        \"请描述{}的含义。\",\n",
    "        \"{}在周易哲学中扮演什么角色？\"\n",
    "    ]\n",
    "\n",
    "    # 使用content填充提问模板\n",
    "    questions = [template.format(content) for template in question_templates]\n",
    "\n",
    "    # 创建提问和总结的配对\n",
    "    question_summary_pairs = [(question, summary) for question in questions]\n",
    "\n",
    "    return question_summary_pairs\n",
    "\n",
    "pairs = generate_question_summary_pairs(content, summary)\n",
    "\n",
    "# 将结果写入CSV文件\n",
    "with open('test_dataset.csv', mode='w', newline='', encoding='utf-8') as file:\n",
    "    writer = csv.writer(file)\n",
    "    writer.writerow(['content', 'summary'])\n",
    "    for pair in pairs:\n",
    "        writer.writerow(pair)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "2ebdfd86-23d0-42cf-8009-e2981494ac70",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "样例 1:\n",
      "蒙卦原文\n",
      "蒙。亨。匪我求童蒙，童蒙求我。初筮告，再三渎，渎则不告。利贞。\n",
      "象曰：山下出泉，蒙。君子以果行育德。\n",
      "白话文解释\n",
      "蒙卦：通泰。不是我有求于幼稚愚昧的人，而是幼稚愚昧的人有求于我。第一次占筮，神灵告诉了他。轻慢不敬的再三占筮，轻慢不敬的占筮，神灵就不会告诉他。但还是吉利的卜问。\n",
      "《象辞》说：上卦为艮，象征山；下卦为坎，象征泉。山下有泉，泉水喷涌而出，这是蒙卦的卦象。君子观此卦象，取法于一往无前的山泉，从而以果敢坚毅的行动来培养自身的品德。\n",
      "《断易天机》解\n",
      "蒙卦艮上坎下，为离宫四世卦。蒙即蒙昧，主回还往复，疑惑不前，多忧愁过失，乃是凶卦。\n",
      "北宋易学家邵雍解\n",
      "智慧未开，蒙昧闭塞；犹豫不决，缺乏果断。\n",
      "得此卦者，智慧犹如童蒙，不辨是非，迷失方向；若能顺贤师良友之教，启其聪明则亨通。\n",
      "台湾国学大儒傅佩荣解\n",
      "时运：蓄积德行，出而用世。\n",
      "财运：矿山生意，果决则吉。\n",
      "家宅：君子居吉；婚姻之始。\n",
      "身体：驱去邪热，可保平安。\n",
      "传统解卦\n",
      "这个卦是异卦（下坎上艮）相叠，艮是山的形象，喻止；坎是水的形象，喻险。卦形为山下有险，仍不停止前进，是为蒙昧，故称蒙卦。但因把握时机，行动切合时宜，因此，具有启蒙和通达的卦象。\n",
      "大象：蒙者，昏而无所见也，故宜「启蒙」。\n",
      "运势：初时迷惑不知方向，须忍耐待机而动，凡事多听取别人意见，则运可通。\n",
      "事业：事业开始，混乱无序，危机四伏，以勇敢坚毅的行动可以扭转局面。然而必须接受严格教育，培养这种奋发图强的精神。务必脚踏实地，最忌好高骛远，否则会陷入孤立无援的境地。\n",
      "经商：务必小心谨慎，不得急功近利，尤其应树立高尚的商业道德，以良好的信誉提高竞争力而取胜。\n",
      "求名：必须接受良好的基础教育，陶冶情操。且动机纯正，可以达到目的。\n",
      "婚恋：注意考察对方品德，不可以金钱为诱铒。夫妻需相互宽容、理解。\n",
      "决策：有时会陷入迷惘困顿的境地，加上胆小、不果断，往往误事。如能接受长辈的教诲，甚至严酷的考验，抛弃疑惧的心理，等待适当时机，必然一帆风顺。\n",
      "------\n",
      "样例 2:\n",
      "屯卦原文\n",
      "屯。元，亨，利，贞。勿用，有攸往，利建侯。\n",
      "象曰：云，雷，屯；君子以经纶。\n",
      "白话文解释\n",
      "屯卦。大吉大利，吉利的占卜。不利于出门。有利于建国封侯。\n",
      "《象辞》说：屯的上卦为坎，坎为云，下卦为震，震为雷。云行于上，雷动于下，是屯卦的卦象。君子观此卦象，取法于云雷，用云的恩泽，雷的威严来治理国事。\n",
      "《断易天机》解\n",
      "屯卦坎上震下，为坎宫二世卦。屯说明有困难，又象征动而逢险境，需刚毅果敢方为吉。\n",
      "北宋易学家邵雍解\n",
      "万物始生，开始困难；先劳后逸，苦尽甘来。\n",
      "得此卦者，身处困境，宜守不宜进，须多加辛苦努力，排除困难，方可通达，有初难后解之象。\n",
      "台湾国学大儒傅佩荣解\n",
      "时运：宜守不宜进。\n",
      "财运：创业维艰。\n",
      "家宅：修缮住宅；初婚不和。\n",
      "身体：保存元气。\n",
      "传统解卦\n",
      "这个卦是异卦（下震上坎）相叠，震为雷，喻动；坎为雨，喻险。雷雨交加，险象丛生，环境恶劣。“屯”原指植物萌生大地，万物始生，充满艰难险阻，然而顺时应运，必欣欣向荣。\n",
      "大象：屯者难也，万事欲进而不得进。\n",
      "运势：身处困境，步步为营，有初难后解之意。\n",
      "事业：起初多有不利，要知难而进，小心翼翼，勇往直前，灵活机动，可望获得大的成功，时机到来时一定要抓住，却也不得操之太急，且仍有困难，务必有他人相助，故平时应多施恩惠。\n",
      "经商：创业初期步履艰难，多有挫折。坚定信念最重要，不要为表面现象所迷惑，应积极进取，行动果断，打开出路。若仍无法摆脱困境，则应退守保全，等待机会，再展宏图。\n",
      "求名：积极争取，主动追求，可以成功。\n",
      "婚恋：好事多磨，忠贞纯洁，大胆追求，能够成功，婚姻美满。\n",
      "决策：初始困难，但若具有坚忍不拔的毅力和锲而不舍的奋斗精神，前途不可估量，但往往不为他人理解而陷于孤独苦闷，事业会因此处于困难状态，需要得到贤德之人的帮助才能摆脱。如能以乐观主义精神处世，能取得成就。\n",
      "------\n",
      "样例 3:\n",
      "需卦原文\n",
      "需。有孚，光亨，贞吉。利涉大川。\n",
      "象曰：云上于天，需；君子以饮食宴乐。\n",
      "白话文解释\n",
      "需卦：抓到俘虏。大吉大利，吉利的卜问。有利于涉水渡河。\n",
      "《象辞》说：需的上卦为坎，表示云；下卦为乾，表示天。云浮聚于天上，待时降雨是需卦的卦象。君子观此卦象，可以宴饮安乐，待时而动。\n",
      "《断易天机》解\n",
      "需卦坎上乾下，为坤宫游魂卦。需为踌躇、期待，虽然刚强，但前面有险阻，应当等待，涉大川则利。\n",
      "北宋易学家邵雍解\n",
      "坎陷当前，遇阻不进；大器晚成，收成在后。\n",
      "得此卦者，时机尚未成熟，需要耐心等待，急进反会见凶。\n",
      "台湾国学大儒傅佩荣解\n",
      "时运：时机尚未成熟，耐心等待。\n",
      "财运：资本未集，无法开张。\n",
      "家宅：平安是福。\n",
      "身体：调节饮食，健康有望。\n",
      "传统解卦\n",
      "这个卦是异卦（下乾上坎）相叠，下卦是乾，刚健之意；上卦是坎，险陷之意。以刚逢险，宜稳健之妥，不可冒失行动，观时待变，所往一定成功。\n",
      "大象：云登天上而未雨，不能急进，等待时机之象。\n",
      "运势：智者必须待时而行，急进反见凶险。\n",
      "事业：关键在于审时度势，耐心等待，事成于安祥，切勿冒险，欲速不达。自己要充满自信，临危不惧，坚守中正，必可化险为夷。情况有利时，仍得居安思危。\n",
      "经商：行动之初，情况困难，必须以极大的耐心，创造条件和机会，行事光明磊落，观时待变，实现愿望。事情接近成功时，更应小心谨慎，切莫功亏一篑。\n",
      "求名：时机尚不成熟，应耐心等待。这时应坚定信念，不为闲言流语所动摇，努力丰富自己，再求助可靠的人便可成功。\n",
      "婚恋：慎重，切不可草率行事，逐渐培养感情，以诚实、热情相待，会发生变故，仍可以有良好的结局。双方都应懂得以柔克刚的道理。\n",
      "决策：前途光明，有雄心大志，且可实现。为此需要积蓄实力，等待时机，大器晚成。本人具有坚强的意志，冷静的头脑。前进途中会遇到困难和险阻，必须十分谨慎，坦然对待小人的中伤，在灾祸在面前能镇静自若。不轻举妄动，冷静选择方向。为人谦和、坦率，多有他人相助，促使事业成功。当时机成熟后，必然一帆风顺。\n",
      "------\n",
      "样例 4:\n",
      "讼卦原文\n",
      "讼。有孚，窒惕，中吉，终凶。利见大人，不利涉大川。\n",
      "象曰：天与水违行，讼。君子以做事谋始。\n",
      "白话文解释\n",
      "讼卦：虽有利可图(获得俘虏)，但要警惕戒惧。其事中间吉利，后来凶险。占筮得此爻，有利于会见贵族王公，不利于涉水渡河。\n",
      "《象辞》说：上卦为乾，乾为天；下卦为坎，坎为水，天水隔绝，流向相背，事理乖舛，这是讼卦的卦象。君子观此卦象，以杜绝争讼为意，从而在谋事之初必须慎之又慎。\n",
      "《断易天机》解\n",
      "讼卦乾上坎下，为离宫游魂卦。上乾为刚，下坎为险，一方刚强，一方阴险，必然产生争论，因此多有不吉。\n",
      "北宋易学家邵雍解\n",
      "天高水深，达远不亲；慎谋退守，敬畏无凶。\n",
      "得此卦者，身心不安，事多不顺，与他人多争诉之事，宜修身养性，谨慎处事。\n",
      "台湾国学大儒傅佩荣解\n",
      "时运：功名受阻，不宜树敌。\n",
      "财运：开始谨慎，终可获利。\n",
      "家宅：君子必求淑女。\n",
      "身体：预防胜于治疗。\n",
      "传统解卦\n",
      "这个卦是异卦（下坎上乾）相叠。同需卦相反，互为“综卦”。乾为刚健，坎为险陷。刚与险，健与险，彼此反对，定生争讼。争讼非善事，务必慎重戒惧。\n",
      "大象：乾天升于上，坎水降于下，相背而行而起讼。\n",
      "运势：事与愿违，凡事不顺，小人加害，宜防陷阱。\n",
      "事业：起初顺利，有利可图，继而受挫，务必警惕，慎之又慎，不得固执已见，极力避免介入诉讼纠纷的争执之中。与其这样，不如退而让人，求得化解，安于正理，可免除意外之灾。陷入争讼，即使获胜，最后还得失去，得不偿失。\n",
      "经商：和气生财，吃亏是福，切勿追求不义之财。商业谈判应坚持公正、公平、互利的原则，尽量避免发生冲突。这样便会有好结果。\n",
      "求名：不利。自己尚缺乏竞争实力，应坚守纯正，隐忍自励，自强自勉，切莫逞强。依靠有地位的人的帮助，及早渡过难关。\n",
      "婚恋：虽不尽人意，倒也般配，彼此理解，未尝不可。双方应以温和的方式处理生活。\n",
      "决策：争强好胜，不安于现状，为改变命运和超越他人而奋斗。头脑聪颖，反应敏捷，有贵人相助。但缺乏持之以恒的毅力，容易露出锋芒，得罪他人，带来诉讼之灾。宜承认现实，顺其自然，知足，适可而止。接受教训，引以为戒，可功成名就。\n",
      "------\n",
      "样例 5:\n",
      "师卦原文\n",
      "师。贞，丈人吉，无咎。\n",
      "象曰：地中有水，师。君子以容民畜众。\n",
      "白话文解释\n",
      "师卦：占问总指挥的军情，没有灾祸。\n",
      "《象辞》说：下卦为坎，坎为水；上卦为坤，坤为地，像“地中有水”，这是师卦的卦象。君子观此卦象，取法于容纳江河的大地，收容和畜养大众。\n",
      "《断易天机》解\n",
      "师卦坤上坎下，为坎宫归魂卦。师即兵众，只有选择德高望重的长者来统率军队，才能吉祥无咎。\n",
      "北宋易学家邵雍解\n",
      "忧劳动众，变化无穷；公正无私，排除万难。\n",
      "得此卦者，困难重重，忧心劳众，宜包容别人，艰苦努力，摒除一切困难。\n",
      "台湾国学大儒傅佩荣解\n",
      "时运：包容别人，修行待时。\n",
      "财运：有财有库，善自珍惜。\n",
      "家宅：旧亲联姻，可喜可贺。\n",
      "身体：腹胀之症，调气无忧。\n",
      "传统解卦\n",
      "这个卦是异卦（下坎上坤）相叠。“师”指军队。坎为水、为险；坤为地、为顺，喻寓兵于农。兵凶战危，用兵乃圣人不得已而为之，但它可以顺利无阻碍地解决矛盾，因为顺乎形势，师出有名，故能化凶为吉。\n",
      "大象：养兵聚众，出师攻伐之象，彼此有伤，难得安宁。\n",
      "运势：困难重重，凡事以正规行事，忌独断独行、投机取巧，提防潜在敌人。\n",
      "事业：阻力很大，困难很多，处于激烈的竞争状态，要与他人密切合作，谨小慎微，行为果断，切忌盲目妄动，适度即可，注意保全自己。机动灵活，严于律已。从容沉着对付一切，必能成功。\n",
      "经商：已有一定的积蓄，可以从事大的营销活动，但必卷入激烈商战，以刚毅顽强的精神和高尚的商业道德，辅以灵活的方法，勿贪图小利，勿掉以轻心，加强与他人的沟通，必可摆脱困境，化险为夷。\n",
      "求名：具备很好的条件，但须有正确的引导，务必严格要求自己，克服不利因素的干扰，经过扎实努力，必可名利双全。\n",
      "婚恋：慎重、专注，否则会陷入“三角”纠纷。痴情追求可以达到目的。\n",
      "决策：天资聪颖，性格灵活，具有坚强的意志，对事业执着追求，迎难而进。可成就大事业。喜竞争，善争辩，富有冒险精神，不免带来麻烦，务老成持重，不贪功，以中正为要。\n",
      "------\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\27727\\AppData\\Local\\Temp\\ipykernel_912\\1242275628.py:105: LangChainDeprecationWarning: The method `BaseChatModel.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.\n",
      "  ai_message = chat(messages)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "content:\"蒙卦\"\n",
      "summary:\"在周易中，蒙卦由上卦艮（山）和下卦坎（水）组成，体现出山下有泉的意象。蒙卦的核心思想是启迪与引导，对于尚未开窍的幼稚无知之人，反映出一种求教于人的智慧，而非自以为是地求索。卦辞指出：“不是我有求于幼稚愚昧的人，而是幼稚愚昧的人有求于我”，表现出在教育与启蒙中的反向关系。\n",
      "\n",
      "咸卦不仅代表着初始的不确定与迷茫，还暗示在浑浑噩噩的状态中，应当耐心等待，明辨是非。第一次占筮可得启示，但若轻慢不敬则会失去指引。从象辞来看，君子应以坚定果敢的行动来培育自己的品德，像从山中涌出的泉水般不断向前。\n",
      "\n",
      "在运势方面，蒙卦提示初期可能会迷惑和不知方向，需认真听取他人的意见，并忍耐待机而动。对于事业及经商者而言，面对混乱局面须勇敢坚毅，同时要扎实基础教育，树立高尚商业道德。\n",
      "\n",
      "总的来说，蒙卦象征着启蒙和前行的契机，呼吁在迷惑中坚持教育与成长，以确保未来的顺利与成功。\"\n",
      "Content: 蒙卦\n",
      "Summary: 在周易中，蒙卦由上卦艮（山）和下卦坎（水）组成，体现出山下有泉的意象。蒙卦的核心思想是启迪与引导，对于尚未开窍的幼稚无知之人，反映出一种求教于人的智慧，而非自以为是地求索。卦辞指出：“不是我有求于幼稚愚昧的人，而是幼稚愚昧的人有求于我”，表现出在教育与启蒙中的反向关系。\n",
      "\n",
      "咸卦不仅代表着初始的不确定与迷茫，还暗示在浑浑噩噩的状态中，应当耐心等待，明辨是非。第一次占筮可得启示，但若轻慢不敬则会失去指引。从象辞来看，君子应以坚定果敢的行动来培育自己的品德，像从山中涌出的泉水般不断向前。\n",
      "\n",
      "在运势方面，蒙卦提示初期可能会迷惑和不知方向，需认真听取他人的意见，并忍耐待机而动。对于事业及经商者而言，面对混乱局面须勇敢坚毅，同时要扎实基础教育，树立高尚商业道德。\n",
      "\n",
      "总的来说，蒙卦象征着启蒙和前行的契机，呼吁在迷惑中坚持教育与成长，以确保未来的顺利与成功。\n",
      "创建CSV文件并写入标题行\n",
      "Content: 蒙卦\n",
      "Summary: 在周易中，蒙卦象征着启蒙和通达，卦象由艮（山）在上、坎（水）在下相叠而成。其原文中提到：“蒙。亨。”强调通泰，暗示乃是幼稚无知的人渴求智者的引导。初次占卦时，神灵速告吉兆，但若再三轻慢占筮，则神灵将不再应答。此卦虽然初时迷惑却仍有吉祥之意。\n",
      "\n",
      "从《象辞》的解读来看，上卦艮象征稳重的山，下卦坎则代表活力涌动的泉水，二者的结合展现出山下有泉的活力与盎然生机。君子应当以此作为启示，蜕变为以坚定果敢的行动来培养德行。\n",
      "\n",
      "传统解卦的角度指出，蒙卦代表着初期迷茫、犹豫不决的阶段，若能实践良师教诲，智慧方能启迪。邵雍的解说则强调了智慧的启发与成长以应对困境。\n",
      "\n",
      "运势上，这一卦常象征事业的开始，初期混乱与危机并存，但只要采取果断行动，认真学习并不断积累经验，就能化解困难。经商方面强调谨慎行事、树立高尚的商业道德。在婚恋中亦需相互理解宽容，切忌物质诱惑。整体而言，成功与否关键在于是否能抛弃疑惧，接受磨练并把握适当的时机。\n",
      "Content: 屯卦\n",
      "Summary: 在周易中，屯卦是一个象征着艰险与新生的卦象，由异卦相叠而成：上卦坎（云）和下卦震（雷）。卦辞中提到“元，亨，利，贞”，代表着良好的占卜结果，然而却不利于出行，反而有利于建立国家与封侯。\n",
      "\n",
      "屯卦的象征意义在于，云在上而雷在下，显示出动与险的相互作用。君子通过此卦象理解到，治理国家应如同运用云的恩泽与雷的威严，需刚毅果敢以应对艰难境遇。\n",
      "\n",
      "《断易天机》指出，屯卦不仅象征困难，还有动与险的结合，提醒人们在面临困境时应坚守不进，付出努力方能克服困难。北宋易学家邵雍也强调万物萌生之初往往面临困难，提示人们应先有所付出，后期才会有所回报。\n",
      "\n",
      "此外，传统解卦认为此卦意在困难频现，行事需步步为营，虽有初难后解的期待，但仍应小心谨慎，尤其是在事业与创业初期时。婚恋方面则强调忠贞不渝，大胆追求终究能获得幸福。\n",
      "\n",
      "屯卦提醒我们：面对初始的艰难与困境，若能恪守原则、坚定信念并积极行动，终能在逆境中寻找到希望与成功的机会。故在各方面行事宜有耐心，审时度势，方能顺应形势，迎接最终的吉祥与成就。\n",
      "Content: 需卦\n",
      "Summary: 在周易中，需卦是一个充满期待和耐心的卦象，由下卦乾（天）与上卦坎（云）相叠而成，象征着云在天上聚集，等待恰当的时机降雨。需卦的核心意涵是：在逆境中，刚强的人应当懂得等待，审时度势，切勿急于行动。\n",
      "\n",
      "此卦预示着大吉大利，强调在渡过困难时刻需依赖耐心和智慧，特别是在面临险阻时，需充分做好准备。尤其在财务、家庭和事业方面，需卦都表明了时机尚不成熟，催促人们积蓄力量，创造条件以待时而动。云在天上却未降雨，提醒人们在成功前要有耐心和毅力。\n",
      "\n",
      "在商业和决策方面，需卦鼓励人们以正直的态度行动，尽量稳定地待发展机会，避免冒失之举。对于感情关系，需卦提倡谨慎而认真的态度，促成健康而稳固的关系。总之，需卦的智慧在于强调耐心与审时度势的重要性，鼓励智慧的人在等待中加强自身的能力和品格，以待来临的吉祥时机。\n",
      "Content: 讼卦\n",
      "Summary: 在周易中，讼卦是一个象征争论与诉讼的卦象，它的上卦为乾（天），下卦为坎（水），二者相背而行，隐喻事物间的矛盾和冲突。虽然此卦中可能有利益可图，但君子应保持谨慎，警惕产生的不安和争讼的风险。其特点在于中间阶段可能吉利，但后期则趁势凶险，特别在涉及水路时，亟需避免涉水渡河。\n",
      "\n",
      "讼卦提醒人们，在行动之前务必深思熟虑，避免引发争议。北宋易学家邵雍认为，讼卦说明具备争论的倾向，因此需小心应对，建议以身修德、谨慎处事。这一卦象用于占卜时，往往暗示运势不顺，可能会与他人产生争诉，需加强自身修养，维护内心的安宁。\n",
      "\n",
      "在个人事业、财运、求名及婚恋方面，本卦乍看有利，但实则需深思熟虑，以和谐为主，不可执着于纠纷。对于决策者而言，应理性看待竞争与争强好胜，适可而止，知足常乐，以免因过度追求目标而带来诉讼之祸。总之，讼卦的哲学要义在于：处理纷争，宜退而避之，顺其自然，安于正理，便可化解潜在的危机。\n",
      "Content: 师卦\n",
      "Summary: 师卦是周易中的重要卦象，象征着军队。在卦象中，下卦为坎（水）与上卦为坤（地）相叠，代表“地中有水”，因此此卦与包容与众多的含义密切相关。根据《象辞》，君子应当学习土地包容江河般宽广的德行，以容纳和培育人民。\n",
      "\n",
      "此卦在占问军情方面意味着没有灾祸，吉祥无咎，强调了德高望重的长者在统率军队中的重要性，正如北宋易学家邵雍所述，要以公正无私、艰苦努力来应对眼前的困难，并提倡包容他人。\n",
      "\n",
      "在运势的解读上，师卦指示面临诸多挑战，建议在行事时遵循规则，避免独断或冒险行为。此卦在事业上意味着激烈的竞争，但只要保持谨慎和灵活，即可应对各种困难。经商方面，师卦表明有积蓄可用于大规模的营销活动，但需应对激烈的市场竞争，通过高尚的商业原则实现成功。\n",
      "\n",
      "总之，师卦强调了与他人合作的重要性，提倡在包容他人、坚守原则中寻求个人的成功，路径虽艰难，但只要坚持努力，终将能化险为夷。\n",
      "Content: \"比卦\n",
      "Summary: \"比卦\"\n",
      "summary: \"比卦在周易中是一个象征吉祥的卦象，由下卦坤（地）和上卦坎（水）相叠而成，象征着地上有水，地纳江河，表现出水与大地的亲密依存关系，寓意相亲相伴、互相扶持。卦象的涵义强调了和谐共处、广泛联系的重要性。\n",
      "\n",
      "根据原文的解释，比卦代表着长久的吉祥，若再次占卜，则仍为大利。对于迟迟不愿臣服的国家可能会面临困境。在《象辞》中提到，先王以此卦象作为参考，体现出与周边国家的亲近和合，强调了建立良好关系的重要性。\n",
      "\n",
      "从不同角度进行的解读也一致强调了比卦的诸多利好。比卦提倡相互扶持的人际关系，意味着借助众人的力量可达成目标，事业上能够得到朋友的支持，从而得到荣显。若在决策和交往中保持善良、宽厚、真诚的态度，必能获得他人的帮助与回报。\n",
      "\n",
      "总而言之，比卦不仅意味着个人的努力，还强调了他人支持的重要性。无论在事业、财运还是家庭关系上，此卦皆寓意着和谐与共赢的局面，值得谨慎对待人际关系及选择交友的标准。通过建立良好的人际网络，有望实现理想并享受成功的果实。\n",
      "Content: 坤卦\n",
      "Summary: 在周易中，坤卦象征着大地与柔顺，具有极其重要的象征意义。坤卦由两个相同的坤卦叠加构成，代表了一种纯阴的特性。其基本涵义为“大吉大利”，象征着丰收与顺境，适合询问与女性、家庭、财富等相关问题。\n",
      "\n",
      "在《易经》中，坤卦内容如下：“元，亨，利牝马之贞”。意指在吉利的环境中，若占问雌马，则会得到吉兆。君子出行，起初迷失方向，后得归宿，表慧及时候，西南方向有利于结交朋友，而东北方向则可能失去朋友。因此，安定于内心，保持顺从和贞诚为吉。\n",
      "\n",
      "在《象辞》中说道：“地势坤，君子以厚德载物”。这意味着大地广阔，承载万物，君子应以深厚的德行来承担重大责任。在实践中，得此卦者应顺应天时，以静制动。不宜单独冒险，而应借助他人的力量，共同合作，以期成功。\n",
      "\n",
      "著名易学家邵雍曾指出，静守安顺，妄动必招损。此卦也强调了柔顺的重要性，强调以德而动，务实稳健。傅佩荣则认为此卦带来声名远扬和家庭安定的好运。\n",
      "\n",
      "在职场和商业运势上，坤卦提醒不要急于冒进，稳健行事为宜。事业上应倾听他人意见，与同仁合作为成，尤其不可单打独斗。求名有望，但需踏实努力，而婚恋则适宜柔顺对待，才能获得美好姻缘。\n",
      "\n",
      "总的来说，坤卦鼓励我们内心修养、宽厚待人，重视合作，以直率的态度与人交往，最终可得成功与吉祥。\n",
      "Content: 乾卦\n",
      "Summary: 在《周易》中，乾卦是六十四卦之首，其卦象由六个阳爻组成，象征着宏伟的天道。乾卦的卦辞是“元，亨，利，贞”，构成了大吉大利的格局。通过《象辞》的阐述，“天行健，君子以自强不息”，表达了天道的刚健和不断追求进取的精神，意在告诫君子应当以天为法，自强不息，永不懈怠。\n",
      "\n",
      "乾卦的解读中，刚阳之气旺盛、通达，象征着成功和利好的前景。然而，必须以正道行事，方能确保长久的亨通。关于运势，得此卦者象征着飞龙在天，实力和名誉并存，需把握时机争取成果。这一卦象在事业上意味着诸事顺利，心想事成，但也需警惕骄傲自满，以保持成功的状态。\n",
      "\n",
      "在经商方面，乾卦代表了发展良机，但不能急于求成，需冷静分析，这样能够有效应对挑战，最终获得满意的回报。在婚恋关系中，虽然阳气旺盛，但刚柔相济能形成美满的结果，尤其对温柔的女性更为有利。\n",
      "\n",
      "整体而言，乾卦是强调自强不息的卦象，提醒人们在追求成就的过程中，修身齐家，以德行为先，克服困难，淡定处世，才能迎来长久的成功与和谐。此卦总结了一个人应有的作为：坚韧、自强、正直、公允，最终克服 thất难，实现自我的提升。\n",
      "写入完成\n"
     ]
    }
   ],
   "source": [
    "from langchain.schema import HumanMessage, SystemMessage, BaseMessage, ChatResult, ChatGeneration\n",
    "from langchain.chat_models.base import BaseChatModel\n",
    "from typing import List, Dict, Any, Optional\n",
    "import requests\n",
    "from pydantic import Field\n",
    "import csv\n",
    "import datetime\n",
    "import os\n",
    "\n",
    "\"\"\"LangChain的接口规范：\n",
    "    BaseChatModel 要求 _generate 方法返回 ChatResult 对象\n",
    "    ChatResult 必须包含 generations 列表，每个元素是 ChatGeneration\n",
    "\"\"\"\n",
    "class ChatLaozhang(BaseChatModel):\n",
    "    api_key: str = Field(..., description=\"老张API的访问密钥\")\n",
    "    model: str = Field(default=\"gpt-4o-mini\", description=\"使用的模型名称\")\n",
    "    temperature: float = Field(default=1.0, description=\"生成文本的随机性\")\n",
    "    max_tokens: int = Field(default=2048, description=\"最大生成token数\")\n",
    "    api_url: str = Field(default=\"https://api.laozhang.ai/v1/chat/completions\", \n",
    "                        description=\"API端点URL\")\n",
    "\n",
    "    @property\n",
    "    def _llm_type(self) -> str:\n",
    "        \"\"\"返回LLM类型标识符\"\"\"\n",
    "        return \"laozhang-chat\"\n",
    "\n",
    "    def _generate(self, messages: List[BaseMessage], **kwargs) -> ChatResult:\n",
    "        formatted_messages = [\n",
    "            {\"role\": self._get_role(msg), \"content\": msg.content}\n",
    "            for msg in messages\n",
    "        ]\n",
    "        headers = {\n",
    "            \"Authorization\": f\"Bearer {self.api_key}\",\n",
    "            \"Content-Type\": \"application/json\"\n",
    "        }\n",
    "        data = {\n",
    "            \"model\": self.model,\n",
    "            \"messages\": formatted_messages,\n",
    "            \"temperature\": self.temperature,\n",
    "            \"max_tokens\": self.max_tokens,\n",
    "            **kwargs\n",
    "        }\n",
    "        response = requests.post(self.api_url, headers=headers, json=data)\n",
    "        if response.status_code == 200:\n",
    "            content = response.json()[\"choices\"][0][\"message\"][\"content\"]\n",
    "            # 返回符合LangChain要求的ChatResult对象\n",
    "            generation = ChatGeneration(message=HumanMessage(content=content))\n",
    "            return ChatResult(generations=[generation])\n",
    "        else:\n",
    "            raise Exception(f\"API请求失败: {response.text}\")\n",
    "\n",
    "    def _get_role(self, message: BaseMessage) -> str:\n",
    "        if isinstance(message, HumanMessage):\n",
    "            return \"user\"\n",
    "        elif isinstance(message, SystemMessage):\n",
    "            return \"system\"\n",
    "        else:\n",
    "            return \"assistant\"\n",
    "\n",
    "# 使用示例\n",
    "chat = ChatLaozhang(\n",
    "    api_key=\"sk-tAdNbV9aGTCr4fcE2d4b07Aa9f5c443bA7Fb3dE0Ff82F1A1\",  # 请替换为你的真实API密钥\n",
    "    model=\"gpt-4o-mini\",\n",
    "    temperature=1,\n",
    "    max_tokens=4095\n",
    ")\n",
    "\n",
    "def gen_data(raw_content):\n",
    "    \"\"\"\n",
    "    使用LangChain GPT-4o-mini调用处理单个数据样例。\n",
    "\n",
    "    :param raw_content: 原始数据样例。\n",
    "    :return: GPT-4o-mini模型生成的内容。\n",
    "    \"\"\"\n",
    "    # 系统消息定义背景和任务\n",
    "    system_message = SystemMessage(\n",
    "        content=\"\"\"\n",
    "        你是中国古典哲学大师，尤其擅长周易的哲学解读。\n",
    "\n",
    "        接下来，你收到的都是关于周易卦象的解释，你需要整理润色，并生成用于大模型训练的内容和格式。\n",
    "\n",
    "        示例输入：\n",
    "\n",
    "        师卦，此卦是异卦相叠，下卦为坎，上卦为坤。“师”指军队。坎为水、为险；坤为地、为顺，喻寓兵于农。兵凶战危，用兵乃圣人不得已而为之，但它可以顺利无阻碍地解决矛盾，因为顺乎形势，师出有名，故能化凶为吉。占得此卦，对于军事上率师出征非常有利，必无灾祸。师卦是天马出群之卦，以寡伏众之象。\n",
    "        师卦位于讼卦之后，《序卦》之中这样解释道：“讼必有众起，故受之以师。师者，众也。”争讼的人越来越多，以致形成了军队。\n",
    "\n",
    "        期待结果：\n",
    "\n",
    "        content:\"师卦\"\n",
    "        summary:\"在周易中，师卦是一个极具深意的卦象，它由两个异卦相叠组成：下卦坎（水）和上卦坤（地）。这一卦象代表“师”，即军队，寓意着兵力和农力的结合。在这里，坎卦象征着水和险难，而坤卦象征着地和顺从，暗示着通过将军事力量安置于民间，可以在必要时顺利调动。\n",
    "\n",
    "        师卦的核心哲学是：虽然兵力代表着危险和战争，但其使用应当是圣人不得已而为之的最后手段。在正确的情况下，军事力量可以顺应形势，将危险转化为吉祥。因此，在军事策略上，此卦象征着出征将会顺利，无灾祸。\n",
    "\n",
    "        师卦紧随讼卦（争讼卦），在《序卦》中解释为“讼必有众起，故受之以师”。这意味着争端激化至众多人群的参与，形成了类似军队的集体力量。\"\n",
    "        \"\"\"\n",
    "    )\n",
    "\n",
    "    # 人类消息包含原始数据样例\n",
    "    human_message = HumanMessage(\n",
    "        content=raw_content\n",
    "    )\n",
    "\n",
    "    # 构建消息列表并进行模型调用\n",
    "    messages = [system_message, human_message]\n",
    "    ai_message = chat(messages)\n",
    "\n",
    "    return ai_message.content\n",
    "\n",
    "def dataset_parser(ai_message_content):\n",
    "    \"\"\"\n",
    "    解析由gen_data函数生成的ai_message.content，提取content和summary。\n",
    "\n",
    "    :param ai_message_content: gen_data函数返回的文本。\n",
    "    :return: 提取的content和summary。\n",
    "    \"\"\"\n",
    "    # 分割字符串来找到content和summary的位置\n",
    "    content_start = ai_message_content.find('content:\"') + len('content:\"')\n",
    "    content_end = ai_message_content.find('\"\\nsummary:')\n",
    "    summary_start = ai_message_content.find('summary:\"') + len('summary:\"')\n",
    "    summary_end = ai_message_content.rfind('\"')\n",
    "\n",
    "    # 提取并存储content和summary\n",
    "    content = ai_message_content[content_start:content_end].strip()\n",
    "    summary = ai_message_content[summary_start:summary_end].strip()\n",
    "\n",
    "    return content, summary\n",
    "\n",
    "# 初始化一个空列表用于存储原始内容数据\n",
    "raw_content_data = []\n",
    "\n",
    "# 读取文件并分割数据样例\n",
    "with open('chatglm/data/raw_data.txt', 'r', encoding='utf-8') as file:\n",
    "    content = file.read()\n",
    "    # 使用连续的换行符('\\n\\n')作为分隔符来分割文本\n",
    "    data_samples = content.split('\\n\\n')\n",
    "\n",
    "    # 遍历分割后的数据样例并添加到列表中\n",
    "    for sample in data_samples:\n",
    "        # 移除每个样例中的额外空白字符（如果有的话）\n",
    "        cleaned_sample = sample.strip()\n",
    "        # 仅添加非空样例\n",
    "        if cleaned_sample:\n",
    "            raw_content_data.append(cleaned_sample)\n",
    "\n",
    "# 输出结果以验证\n",
    "for i, sample in enumerate(raw_content_data[:5]):  # 打印前5个样例以检查\n",
    "    print(f\"样例 {i+1}:\")\n",
    "    print(sample)\n",
    "    print(\"------\")\n",
    "\n",
    "# 示例调用（使用 raw_data.txt 中解析的数据样例）\n",
    "generated_content = gen_data(raw_content_data[0])\n",
    "print(generated_content)\n",
    "\n",
    "# 示例调用（使用假设的gen_data函数返回的文本）\n",
    "content, summary = dataset_parser(generated_content)\n",
    "print(\"Content:\", content)\n",
    "print(\"Summary:\", summary)\n",
    "\n",
    "def generate_question_summary_pairs(content, summary):\n",
    "    \"\"\"\n",
    "    生成20对提问和总结的配对。\n",
    "\n",
    "    :param content: 内容（例如：“蒙卦”）。\n",
    "    :param summary: 内容的总结。\n",
    "    :return: 包含20对提问和总结的列表。\n",
    "    \"\"\"\n",
    "    # 20种提问模板\n",
    "    question_templates = [\n",
    "        \"{}代表什么？\",\n",
    "        \"周易中的{}含义是什么？\",\n",
    "        \"请解释一下{}。\",\n",
    "        \"{}在周易中是什么象征？\",\n",
    "        \"周易{}的深层含义是什么？\",\n",
    "        \"{}和教育启蒙有什么联系？\",\n",
    "        \"周易的{}讲述了什么？\",\n",
    "        \"{}是怎样的一个卦象？\",\n",
    "        \"{}在周易中怎样表达教育的概念？\",\n",
    "        \"{}的基本意义是什么？\",\n",
    "        \"周易中{}的解释是什么？\",\n",
    "        \"{}在周易中代表了哪些方面？\",\n",
    "        \"{}涉及哪些哲学思想？\",\n",
    "        \"周易中{}的象征意义是什么？\",\n",
    "        \"{}的主要讲述内容是什么？\",\n",
    "        \"周易{}的核心思想是什么？\",\n",
    "        \"{}和启蒙教育之间有何联系？\",\n",
    "        \"在周易中，{}象征着什么？\",\n",
    "        \"请描述{}的含义。\",\n",
    "        \"{}在周易哲学中扮演什么角色？\"\n",
    "    ]\n",
    "\n",
    "    # 使用content填充提问模板\n",
    "    questions = [template.format(content) for template in question_templates]\n",
    "\n",
    "    # 创建提问和总结的配对\n",
    "    question_summary_pairs = [(question, summary) for question in questions]\n",
    "\n",
    "    return question_summary_pairs\n",
    "\n",
    "print(\"创建CSV文件并写入标题行\")\n",
    "with open(\"test_dataset.csv\", mode='w', newline='', encoding='utf-8') as file:\n",
    "    writer = csv.writer(file)\n",
    "    writer.writerow(['content', 'summary'])\n",
    "\n",
    "    # 循环遍历 raw_content_data 数据样例\n",
    "    for raw_content in raw_content_data:\n",
    "        # 调用 gen_data 方法得到 ai_message_content\n",
    "        ai_message_content = gen_data(raw_content)\n",
    "\n",
    "        # 解析 ai_message_content 得到 content 和 summary\n",
    "        content, summary = dataset_parser(ai_message_content)\n",
    "            \n",
    "        print(\"Content:\", content)\n",
    "        print(\"Summary:\", summary)\n",
    "\n",
    "        # 调用 generate_question_summary_pairs 得到20组 pairs\n",
    "        pairs = generate_question_summary_pairs(content, summary)\n",
    "\n",
    "        # 将 pairs 写入 csv 文件\n",
    "        for pair in pairs:\n",
    "            writer.writerow(pair)\n",
    "\n",
    "print(\"写入完成\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "501b7753-6c4d-4bb9-b05d-6932c25bfe55",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "嵌入数量: 5\n",
      "每个嵌入的维度: 1536\n",
      "查询嵌入维度: 1536\n"
     ]
    }
   ],
   "source": [
    "# 嵌入将一段文本创建成向量表示。这非常有用，因为它意味着我们可以在向量空间中思考文本，并且可以执行语义搜索等操作，在向量空间中寻找最相似的文本片段\n",
    "from pydantic import BaseModel, Field\n",
    "from typing import List, Dict, Optional\n",
    "import requests\n",
    "import numpy as np\n",
    "\n",
    "class Document(BaseModel):\n",
    "    \"\"\"接口，用于与文档进行交互。\"\"\"\n",
    "    page_content: str\n",
    "    lookup_str: str = \"\"\n",
    "    lookup_index: int = 0\n",
    "    metadata: Dict[str, str] = Field(default_factory=dict)\n",
    "\n",
    "    @property\n",
    "    def paragraphs(self) -> List[str]:\n",
    "        return self.page_content.split(\"\\n\\n\")\n",
    "\n",
    "    @property\n",
    "    def summary(self) -> str:\n",
    "        return self.paragraphs[0]\n",
    "\n",
    "    def lookup(self, string: str) -> str:\n",
    "        if string.lower() != self.lookup_str:\n",
    "            self.lookup_str = string.lower()\n",
    "            self.lookup_index = 0\n",
    "        else:\n",
    "            self.lookup_index += 1\n",
    "\n",
    "        lookups = [p for p in self.paragraphs if self.lookup_str in p.lower()]\n",
    "        if not lookups:\n",
    "            return \"No Results\"\n",
    "        elif self.lookup_index >= len(lookups):\n",
    "            return \"No More Results\"\n",
    "        else:\n",
    "            result_prefix = f\"(Result {self.lookup_index + 1}/{len(lookups)})\"\n",
    "            return f\"{result_prefix} {lookups[self.lookup_index]}\"\n",
    "\n",
    "class LaozhangEmbeddings:\n",
    "    def __init__(self, \n",
    "                 api_key: str,\n",
    "                 model: str = \"text-embedding-ada-002\",\n",
    "                 base_url: str = \"https://api.laozhang.ai/v1\"):\n",
    "        \n",
    "        self.api_key = api_key\n",
    "        self.model = model\n",
    "        self.base_url = base_url\n",
    "        \n",
    "    def embed_documents(self, texts: List[str]) -> List[List[float]]:\n",
    "        \"\"\"嵌入多个文档\"\"\"\n",
    "        if not texts:\n",
    "            return []\n",
    "            \n",
    "        headers = {\n",
    "            \"Authorization\": f\"Bearer {self.api_key}\",\n",
    "            \"Content-Type\": \"application/json\"\n",
    "        }\n",
    "        data = {\n",
    "            \"model\": self.model,\n",
    "            \"input\": texts\n",
    "        }\n",
    "        \n",
    "        try:\n",
    "            response = requests.post(\n",
    "                f\"{self.base_url}/embeddings\",\n",
    "                headers=headers,\n",
    "                json=data,\n",
    "                timeout=15\n",
    "            )\n",
    "            \n",
    "            # 处理API错误响应\n",
    "            if response.status_code != 200:\n",
    "                error_info = response.json().get(\"error\", {})\n",
    "                error_msg = error_info.get(\"message\", \"未知错误\")\n",
    "                raise ValueError(f\"API错误({response.status_code}): {error_msg}\")\n",
    "                \n",
    "            return [item['embedding'] for item in response.json()['data']]\n",
    "            \n",
    "        except requests.exceptions.RequestException as e:\n",
    "            raise Exception(f\"API请求失败: {str(e)}\")\n",
    "\n",
    "    def embed_query(self, text: str) -> List[float]:\n",
    "        \"\"\"嵌入单个查询\"\"\"\n",
    "        return self.embed_documents([text])[0]\n",
    "\n",
    "# 初始化嵌入模型\n",
    "embeddings_model = LaozhangEmbeddings(\n",
    "    api_key=\"sk-tAdNbV9aGTCr4fcE2d4b07Aa9f5c443bA7Fb3dE0Ff82F1A1\"  # 替换为你的API密钥\n",
    ")\n",
    "\n",
    "# 嵌入文档示例\n",
    "embeddings = embeddings_model.embed_documents([\n",
    "    \"Hi there!\",\n",
    "    \"Oh, hello!\",\n",
    "    \"What's your name?\",\n",
    "    \"My friends call me World\",\n",
    "    \"Hello World!\"\n",
    "])\n",
    "print(f\"嵌入数量: {len(embeddings)}\")\n",
    "print(f\"每个嵌入的维度: {len(embeddings[0])}\")\n",
    "\n",
    "# 嵌入查询示例\n",
    "query = \"What was the name mentioned in the conversation?\"\n",
    "query_embedding = embeddings_model.embed_query(query)\n",
    "print(f\"查询嵌入维度: {len(query_embedding)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b4142595-42f3-4cee-a255-f8109813e3ad",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
